﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Sql;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace UricaoWeb.Datos.ConexionBD.Propiedad
{
	public class OperacionHabitacionBD
	{
		#region LOGICA HABITACIONES
			#region ATRIBUTOS DE LA CLASE
			private SqlConnection _conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ConnectionString.ToString());
			private SqlCommand _comandoSql = new SqlCommand();
			private SqlDataAdapter _adaptadorDatos;
			private DataSet _setDatos = new DataSet();
			
			#endregion

			#region LLENADOS Y FILTRADOS BASICOS
			public static DataSet BuscarHabitacionPorNumero(string IdHabitacion, string IdHotel)
			{
				OperacionHabitacionBD _habsPorNum = new OperacionHabitacionBD();

				return _habsPorNum.HabitacionPorNumero(IdHabitacion,IdHotel);
			}

			private DataSet HabitacionPorNumero(string _idHabitacion, string _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_habitacionPorNumero " + _idHabitacion + "," + _idHotel + "", _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_comandoSql.Parameters.AddWithValue("@IdHab", _idHabitacion);
				_comandoSql.Parameters.AddWithValue("@IdHotel", _idHotel);
				_adaptadorDatos.Fill(_setDatos);

				return FormatearNumeroHabitacion(_setDatos);
			}

			public static DataSet ObtenerTodoHotel()
			{
				OperacionHabitacionBD _hoteles = new OperacionHabitacionBD();

				return _hoteles.TodosHoteles();
			}
		
			private DataSet TodosHoteles()
			{
				_comandoSql = new SqlCommand("Propiedades_GetAllHoteles ", _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_adaptadorDatos.Fill(_setDatos);
				return _setDatos;
			}

			public static DataSet HabitacionesUnHotel(int _idHotel)
			{
				OperacionHabitacionBD _habitaciones = new OperacionHabitacionBD();
				return _habitaciones.Habitaciones(_idHotel);
			}

			private DataSet Habitaciones(int _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_GetHabitacionesPorHotel " + _idHotel, _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_adaptadorDatos.Fill(_setDatos);
				return _setDatos;
			}

			public static DataSet ObtenerHabitacionesPorTipoUnHotel(int _idHotel)
			{
				OperacionHabitacionBD _porTipo = new OperacionHabitacionBD();
				return _porTipo.TipoHabitaciones(_idHotel);
			}

			private DataSet TipoHabitaciones(int _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_GetHabitacionesPorTipo " + _idHotel, _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_adaptadorDatos.Fill(_setDatos);
				return _setDatos;
			}

			public static DataSet ObtenerHabitacionesPorPisoUnHotel(int _idHotel)
			{
				OperacionHabitacionBD _porPiso = new OperacionHabitacionBD();
				return _porPiso.HabitacionesPorPiso(_idHotel);
			}

			private DataSet HabitacionesPorPiso(int _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_GetHabitacionesPorPiso " + _idHotel, _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_adaptadorDatos.Fill(_setDatos);
				return _setDatos;
			}

			public static DataSet BuscarHabitacionesPorTipo(string _idHabitacion, string _idHotel)
			{
				OperacionHabitacionBD _porTipo = new OperacionHabitacionBD();
				return _porTipo.ObtenerHabitacionPorTipo(_idHabitacion, _idHotel);
			}

			private DataSet ObtenerHabitacionPorTipo(string _tipoHabitacion, string _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_habitacionPorTipo '" + _tipoHabitacion + "'," + _idHotel + "", _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_comandoSql.Parameters.AddWithValue("@tipoHabitacion", _tipoHabitacion);
				_comandoSql.Parameters.AddWithValue("@IdHotel", _idHotel);
				_adaptadorDatos.Fill(_setDatos);

				return (DataSet)FormatearNumeroHabitacion(_setDatos);
			}

			public static DataSet BuscarHabitacionesPorPiso(string _numeroPiso, string _idHotel)
			{
				OperacionHabitacionBD _porPiso = new OperacionHabitacionBD();
				return _porPiso.ObtenerHabitacionPorPiso(_numeroPiso, _idHotel);
			}

			private DataSet ObtenerHabitacionPorPiso(string _numeroPiso, string _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_habitacionPorPiso " + _numeroPiso + "," + _idHotel + "", _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_comandoSql.Parameters.AddWithValue("@numeroPiso", _numeroPiso);
				_comandoSql.Parameters.AddWithValue("@IdHotel", _idHotel);
				_adaptadorDatos.Fill(_setDatos);

				return (DataSet)FormatearNumeroHabitacion(_setDatos); 
			}

			internal static DataSet ObtenerHabitacionPorId(string _idHabitacion)
			{
				OperacionHabitacionBD _registro = new OperacionHabitacionBD();
				_registro._comandoSql = new SqlCommand("Propiedades_ObtenerHabitacionPorId " + _idHabitacion + "", _registro._conexion);
				_registro._adaptadorDatos = new SqlDataAdapter(_registro._comandoSql);
				_registro._comandoSql.Parameters.AddWithValue("@IdHabitacion", _idHabitacion);
				_registro._adaptadorDatos.Fill(_registro._setDatos);
				_registro._setDatos = _registro.FormatearNumeroHabitacion(_registro._setDatos);
				return _registro._setDatos;
			}

			#endregion

			#region ACTUALIZACION DE BD
			internal static bool ValidarPisoCorrespondiente(string _pisoHabitacion, string _idHotel)
			{
				OperacionHabitacionBD _validacion = new OperacionHabitacionBD();
				return _validacion.ValidarPisoHabitacion(_pisoHabitacion,_idHotel);
			}

			private Boolean ValidarPisoHabitacion(string _pisoHabitacion, string _idHotel)
			{
				_comandoSql = new SqlCommand("Propiedades_PisosDelHotel " + _idHotel + "", _conexion);
				_adaptadorDatos = new SqlDataAdapter(_comandoSql);
				_comandoSql.Parameters.AddWithValue("@IdHotel", _idHotel);
				_adaptadorDatos.Fill(_setDatos);

				for (int contador = 0; contador < _setDatos.Tables[0].Rows.Count; contador++)
				{
					if (_setDatos.Tables[0].Rows[contador][0].ToString() == _pisoHabitacion || _setDatos.Tables[0].Rows[contador][0].ToString() == _pisoHabitacion + " ")
					{
						return true;
					}
				}

				return false;
			}

			internal static bool ActualizarRegistros(DataTable _datosModificar, string _idHabitacion)
			{
				if (_datosModificar.Rows.Count > 0)
				{
					int _numeroHabitacion = Convert.ToInt32(_datosModificar.Rows[0]["numeroHabitacion"].ToString());
					int _pisoHabitacion = Convert.ToInt32(_datosModificar.Rows[0]["pisoHabitacion"].ToString());
					int _capacidad = Convert.ToInt32(_datosModificar.Rows[0]["capacidad"].ToString());
					float _costo = Convert.ToSingle(_datosModificar.Rows[0]["costo"].ToString());
					string _descripcion = _datosModificar.Rows[0]["descripcion"].ToString();
					string _tipoHabitacion = _datosModificar.Rows[0]["tipoHabitacion"].ToString();

					OperacionHabitacionBD _insertar = new OperacionHabitacionBD();
					_insertar._comandoSql = new SqlCommand("Propiedades_AcutalizarHabitacion " + (_numeroHabitacion) + ",'" + _tipoHabitacion + "'," + true + "," + (_costo) + "," + _capacidad + "," + _pisoHabitacion + "," + _idHabitacion + ",'" + _descripcion + "' ", _insertar._conexion);
					_insertar._adaptadorDatos = new SqlDataAdapter(_insertar._comandoSql);
					_insertar._comandoSql.Parameters.AddWithValue("@_numeroHabitacion", _numeroHabitacion);
					_insertar._comandoSql.Parameters.AddWithValue("@_tipoHabitacion", _tipoHabitacion);
					_insertar._comandoSql.Parameters.AddWithValue("@_costo", _costo);
					_insertar._comandoSql.Parameters.AddWithValue("@_piso", _pisoHabitacion);
					_insertar._comandoSql.Parameters.AddWithValue("@_capacidad", _capacidad);
					_insertar._comandoSql.Parameters.AddWithValue("@_descripcion", _descripcion);
					_insertar._comandoSql.Parameters.AddWithValue("@_idHabitacion", _idHabitacion);
					_insertar._adaptadorDatos.Fill(_insertar._setDatos);

					return true;

				}

				return false;
			}
			#endregion

			#region ELIMINAR REGISTROS DE BD
			internal static Boolean SqlDatasourceBorrarRegistroHabitacion(string _idHabitacion)
			{
				OperacionHabitacionBD _borradoRegistro = new OperacionHabitacionBD();
				_borradoRegistro._comandoSql = new SqlCommand("Propiedades_BorrarHabitacionDeHotel " + _idHabitacion + "", _borradoRegistro._conexion);
				_borradoRegistro._adaptadorDatos = new SqlDataAdapter(_borradoRegistro._comandoSql);
				_borradoRegistro._comandoSql.Parameters.AddWithValue("@IdHabitacion", _idHabitacion);
				_borradoRegistro._adaptadorDatos.Fill(_borradoRegistro._setDatos);

				if (_borradoRegistro._setDatos.Tables.Count == 0)
					return true;

				return false;
			}
			#endregion

			#region INSERTADO EN BD
			internal static bool InsertarFilaNuevaHabitacion(DataTable _datos)
			{
				if(_datos.Rows.Count > 0)
				{
					int _numeroHabitacion = Convert.ToInt32(_datos.Rows[0]["numeroHabitacion"].ToString());
					int _pisoHabitacion = Convert.ToInt32(_datos.Rows[0]["pisoHabitacion"].ToString());
					int _capacidad = Convert.ToInt32(_datos.Rows[0]["capacidad"].ToString());
					float _costo = Convert.ToSingle(_datos.Rows[0]["costo"].ToString());
					string _descripcion = _datos.Rows[0]["descripcion"].ToString();
					int _fkHotel = Convert.ToInt32(_datos.Rows[0]["fkHotel"].ToString());
					string _tipoHabitacion = _datos.Rows[0]["tipoHabitacion"].ToString();

					OperacionHabitacionBD _insertar = new OperacionHabitacionBD();
					_insertar._comandoSql = new SqlCommand("Propiedades_InsertarHabitacionNueva " + (_numeroHabitacion) + ",'" + _tipoHabitacion + "'," + (_costo) + "," + _capacidad + "," + _pisoHabitacion + "," + (_fkHotel) + ",'" + _descripcion + "' ", _insertar._conexion);
					_insertar._adaptadorDatos = new SqlDataAdapter(_insertar._comandoSql);
					_insertar._comandoSql.Parameters.AddWithValue("@numeroHabitacion",_numeroHabitacion);
					_insertar._comandoSql.Parameters.AddWithValue("@tipoHabitacion", _tipoHabitacion);
					_insertar._comandoSql.Parameters.AddWithValue("@costo", _costo);
					_insertar._comandoSql.Parameters.AddWithValue("@piso", _pisoHabitacion);
					_insertar._comandoSql.Parameters.AddWithValue("@capacidad", _capacidad);
					_insertar._comandoSql.Parameters.AddWithValue("@descripcion", _descripcion);
					_insertar._comandoSql.Parameters.AddWithValue("@fkHotel", _fkHotel);
					_insertar._adaptadorDatos.Fill(_insertar._setDatos);
					
				
					return true;
				
				}
			
				return false;
			}
			#endregion

		private DataSet FormatearNumeroHabitacion (DataSet _setViejo)
		{
			DataSet _setNuevo = new DataSet();
			DataTable _tablaVieja = new DataTable();
			DataTable _tablaNueva = new DataTable();
			_tablaNueva = CrearTablaDatosFormateada(_tablaNueva);
			int _cuentaFila = _setViejo.Tables[0].Rows.Count;
			string _formato = "";

			_tablaVieja = _setViejo.Tables[0];

			for (int i = 0; i < _cuentaFila; i++ )
			{
				_formato = _tablaVieja.Rows[i]["numeroHabitacion"].ToString();

				if (_formato.Length == 2)
				{
					_formato = "0" + _formato;
				}
				if (_formato.Length == 1)
				{
					_formato = "00" + _formato;
				}

				DataRow _fila = _tablaNueva.NewRow();
				_fila["numeroHabitacion"] = _formato;
				_fila["IdHabitacion"] = _tablaVieja.Rows[i]["IdHabitacion"].ToString();
				_fila["Piso"] = _tablaVieja.Rows[i]["Piso"].ToString();
				_fila["capacidadHabitacion"] = _tablaVieja.Rows[i]["capacidadHabitacion"].ToString();
				_fila["montoHabitacion"] = _tablaVieja.Rows[i]["montoHabitacion"].ToString();
				_fila["disponibilidadHabitacion"] = _tablaVieja.Rows[i]["disponibilidadHabitacion"].ToString();
				_fila["fkHotel"] = _tablaVieja.Rows[i]["fkHotel"].ToString();
				_fila["tipoHabitacion"] = _tablaVieja.Rows[i]["tipoHabitacion"].ToString();
				_fila["descripcionHabitacion"] = _tablaVieja.Rows[i]["descripcionHabitacion"].ToString();

				_tablaNueva.Rows.Add(_fila);
			}

			_setNuevo.Tables.Add(_tablaNueva);

			return _setNuevo;
		}

		private DataTable CrearTablaDatosFormateada(DataTable _tabla)
		{
			_tabla.Columns.Add("IdHabitacion", typeof(int));
			_tabla.Columns.Add("numeroHabitacion", typeof(string));
			_tabla.Columns.Add("tipoHabitacion", typeof(string));
			_tabla.Columns.Add("capacidadHabitacion", typeof(string));
			_tabla.Columns.Add("Piso", typeof(string));
			_tabla.Columns.Add("montoHabitacion", typeof(string));
			_tabla.Columns.Add("disponibilidadHabitacion", typeof(bool));
			_tabla.Columns.Add("descripcionHabitacion", typeof(string));
			_tabla.Columns.Add("fkHotel", typeof(string));

			return _tabla;
		}
		#endregion

		internal static bool InsertarPisoNuevo(string _pisoNuevo, string _idHotel)
		{

			OperacionHabitacionBD _insertarPiso = new OperacionHabitacionBD();
			_insertarPiso._comandoSql = new SqlCommand("Propiedades_InsertarHabitacion "+ _idHotel +","+ _pisoNuevo +" ", _insertarPiso._conexion);
			_insertarPiso._adaptadorDatos = new SqlDataAdapter(_insertarPiso._comandoSql);
			_insertarPiso._comandoSql.Parameters.AddWithValue("@_idHotel", _idHotel);
			_insertarPiso._comandoSql.Parameters.AddWithValue("@_pisoNuevo", _pisoNuevo);
			_insertarPiso._adaptadorDatos.Fill(_insertarPiso._setDatos);

			return true;
		}

		public static string GetHotelByUsername(string _usuario)
		{
			OperacionHabitacionBD _getId = new OperacionHabitacionBD();
			_getId._comandoSql = new SqlCommand("Propiedades_GetHotelByUsername " + _usuario + " ", _getId._conexion);
			_getId._adaptadorDatos = new SqlDataAdapter(_getId._comandoSql);
			_getId._comandoSql.Parameters.AddWithValue("@_nombreUsuario", _usuario);

			_getId._adaptadorDatos.Fill(_getId._setDatos);
			DataTable _tablaNueva = new DataTable();
			int _cuentaFila = _getId._setDatos.Tables[0].Rows.Count;

			_tablaNueva = _getId._setDatos.Tables[0];

			return _tablaNueva.Rows[0]["fkHotel"].ToString();
		}

		public static DataSet GetHabitacionesSinLaSeleccionada(int _idHotel, string _idHabitacion)
		{
			OperacionHabitacionBD _getId = new OperacionHabitacionBD();
			_getId._comandoSql = new SqlCommand("Propiedades_GetHabitacionesSinLaSeleccionada " + _idHotel + "," + _idHabitacion + " ", _getId._conexion);
			_getId._adaptadorDatos = new SqlDataAdapter(_getId._comandoSql);
			_getId._comandoSql.Parameters.AddWithValue("@_idHotel", _idHotel);
			_getId._comandoSql.Parameters.AddWithValue("@_idHabitacion", _idHabitacion);

			_getId._adaptadorDatos.Fill(_getId._setDatos);

			return _getId._setDatos;
		}
	}
}